package linear;

import java.util.Iterator;

public class SequenceList<T> implements Iterable<T>{
    //存储元素的数组
    private T[] eles;
    //记录当前顺序表的元素个数
    private int N;
    public SequenceList(int capacity){
        //初始化数组 长度是它最大容量
        this.eles= (T[]) new Object[capacity];
        //初始长度为0
        this.N=0;

    }
    //通过清零线性表的长度来清空
    public void clear(){
        this.N=0;
    }
    //判断线性表是否为空
    public boolean isEmpty(){

        return N==0;
    }
    //获取指定位置的元素
    public T get(int i){
        return eles[i];
    }
    //向线性表中插入元素T
    public void insert(T t){
        //扩容
        if (N==eles.length){
            resize(eles.length*2);
        }
        eles[N++]=t;

    }
    //向指定位置i插入元素t
    public void insert(int i,T t){
        if (N==eles.length){
            resize(eles.length*2);
        }
        eles[N++]=t;
        for (int index=N-1;index>i;index--){
            eles[index]=eles[index-1];
        }
        eles[i]=t;
        N++;
    }
    //删除指定位置处的元素并返回该元素
    public T remove(int i){
        //记录索引i处的值用于返回
        T current=eles[i];
        //索引之后的所有元素往前移动
        for (int index=i;index<N-1;index++){
            eles[index]=eles[index+1];
        }
        N--;
        //压缩
        if (N<=eles.length/4){
            resize(eles.length/2);
        }


        return current;
    }
    //查找元素第一次出现的位置
    public int indexOf(T t){
        for (int i=0;i<N;i++){
            if (eles[i]==t){
                return i;
            }
        }
        return -1;
    }
    //扩容与压缩，传入新数组长度
    public void resize(int newSize){
        T[] temp=eles;
        eles= (T[]) new Object[newSize];
        for (int i =0 ;i<N;i++){
            eles[i]=temp[i];
        }
    }



    //实现ITerable使得线性表支持
    @Override
    public Iterator iterator(){
        return new SIterator();
    }
    private class SIterator implements Iterator{
        private int cur;
        public SIterator(){
            this.cur=0;
        }


        @Override
        public boolean hasNext() {
            return cur<N;
        }

        @Override
        public Object next() {
            return eles[cur++];
        }
    }



}
